iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 8
1
Software Development

30 天介紹 Java 的 Thread系列 第 8

Day8 介紹 Semaphore Class

  • 分享至 

  • xImage
  •  

前面已經介紹了如何撰寫有關於 Java Thread 的程式了,接下來的幾天會介紹有關於 java.util.concurrent package 下面的一些 class,這些 class 如果會使用的話,對於操作 Thread 是有幫助的。

今天就介紹 Semaphore class 的部份, Semaphore class 主要用來控制 Thread 最多能被用到的次數,如果超過 Semaphore 的設定次數的話就會等待其它的執行緒執行完成,在等待的 Thread 才能進入使用。

建立 Semaphore 物件時需要在建構子裡面指定限制只能被幾個執行緒使用到的數量,程式如下:

Semaphore semaphore = new Semaphore(3);

上面的程式就是定義只能給 3 個執行緒執行到,如果超出 3 個的話就會等到其它的執行緒執行完,才會繼續執行正在等待的執行緒。

semaphore.acquire();

當呼叫 acquire 的方法時就會使用到一個資源,這時建構子定義的 3 就會減去1 就只會剩下 2 個執行緒可以執行到的資源。如果剩下 0 的話其它執行緒就會進行等待的動作。

semaphore.release();

當執行完之後要記得呼叫 release 把資源釋放掉,這時資源的數量就會加上 1,如果沒有釋放掉的話其它的執行緒就沒有辦法拿到資源,會一直等待執行。

以下是完整的程式碼如下:

import java.util.concurrent.Semaphore;
public class ThreadExample implements Runnable {
  private String threadName;
  private Semaphore semaphore;

  public ThreadExample(String threadName, Semaphore semaphore) {
    this.threadName = threadName;
    this.semaphore = semaphore;
  }

  @Override
  public void run() {
    try {
      this.semaphore.acquire();
      Thread.sleep(1000L);
      System.out.println("thread name is:" + this.threadName);
      this.semaphore.release();
    } catch (Exception e) {
      throw new RuntimeException(e);
     }
  }
}

當呼叫到 run 的方法時會要求拿到一個資源這時資源的個數會減去 1 然後等到執行完畢之後會將資源釋放掉,這時資源的個數會加上 1 。

public class Main {
  public static void main(String[] args) {
    Semaphore semaphore = new Semaphore(3);
    Thread thread1 = new Thread(new ThreadExample("thread1", semaphore));
    thread1.start();
  
    Thread thread2 = new Thread(new ThreadExample("thread2", semaphore));
    thread2.start();

    Thread thread3 = new Thread(new ThreadExample("thread3", semaphore));
    thread3.start();

    Thread thread4 = new Thread(new ThreadExample("thread4", semaphore));
    thread4.start();

    Thread thread5 = new Thread(new ThreadExample("thread5", semaphore));
    thread5.start();
  }
}

以上是主程式的呼叫,當有 3 個執行緒在執行時就會進行等待其它 2 個執行緒的執行,等待其它執行緒執行完之後才會開始執行等待的執行緒,以下是執行的結果:

thread name is:thread1
thread name is:thread2
thread name is:thread3
thread name is:thread4
thread name is:thread5

java.util.concurrent 的 package 下還有很多好用的 class 這在之後的幾天都還會繼續介紹到。


上一篇
Day7 使用 Synchronized 保護變數
下一篇
Day9 介紹使用 CopyOnWriteArrayList
系列文
30 天介紹 Java 的 Thread30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言